//2016-5-26 郑捷 创建
#ifndef ModbusMasterRTU_H
#define ModbusMasterRTU_H

#if defined(ARDUINO) && ARDUINO >= 100 // 版本兼容设置
	#include <Arduino.h>
#else
	#include <WProgram.h>
#endif

#include <HardwareSerial.h>
/**********************
ModbusRTU同步读写寄存器功能
**********************/
class ModbusMasterRTU {
public:
	void begin(HardwareSerial *SerialPort);	//初始化函数
	/*读寄存器数据，返回值0x10=读取完成，0x40=超时返回，0x8?=读取结束但返回错误*/
	unsigned char readData(unsigned char PLCID,unsigned int DataStart,unsigned int DataNum,int *Data); 
	/*写寄存器数据，返回值0x10=写入完成，0x40=超时返回，0x8?=写入结束但返回错误*/
	unsigned char writeData(unsigned char PLCID,unsigned int DataStart,unsigned int DataNum,int *Data); 
	/*通讯侦测，返回值0x10=通讯完成，0x40=超时返回，0x8?=通讯结束但返回错误*/
	unsigned char test(unsigned char PLCID,unsigned int Temp); 

private:
	void task(void);//通信处理函数，同步读此函数在内部调用。
	void dataHandle(void); //指令处理函数
	unsigned int calculateCRC(unsigned char* regs,unsigned char arraySize);	//CRC校验函数
	unsigned int calculateCRC1(unsigned char* regs,unsigned char arraySize);	//备用CRC校验函数
	HardwareSerial *pModbusPort;		//用于保存使用MODBUS通信的串口
	unsigned int characterTime; 	//0.1个字符的时间，单位us
	#define bufferSize 128				//一帧数据的最大字节数量
	unsigned char frame[bufferSize];	//用于保存接收或发送的数据
	unsigned char address=0;		//接收数据索引
	unsigned long lastreadtime;		//上次阅读有数据的时间
	unsigned char state=0;			//通讯状态
	unsigned char needSendBytes=0;	//需要发送数据的字节数
	unsigned char cmd[6];			//指令头
	unsigned char err;				//错误代码
	int *pData;						//用于保存读取数据时的数据保存地点的指针
};
#endif
